grammar Sample;

options {
  language = Java;
}

@header {
  package prueba;
}

@lexer::header {
  package prueba;
}

program
	: Sentencia OtraSentencia '$' 
	;

OtraSentencia
	:	';' Sentencia OtraSentencia | Epsilon
	;
	
Sentencia
	:	Asignacion | FuncionPrint
	;
	
Asignacion
	: Variable OperadorAsignacion Expresion
	;
	
Variable
	: Letra | Ident Letra
	; 

Expresion
	: Termino MasTerminos
	;
	
MasTerminos
	: '+' Termino MasTerminos | '-' Termino MasTerminos | Epsilon
	;

Termino
	: Factor MasFactores
	;
	
MasFactores
	: '*' Factor MasFactores | '/' Factor MasFactores | '%' Factor MasFactores
	;

Factor
	: '(' Expresion ')' | Variable | Digito
	;
	
FuncionPrint
	: 'print' Expresion 
	;
	
Epsilon
	: 'e'
	;

OperadorAsignacion: ('=' | '+=' | '-=' | '*=' | '/=');
Letra: ('a'..'z' | 'A'..'Z');
Ident: ('a'..'z' | 'A'..'Z' | '0'..'9')+;
Digito: ('0'..'9')+;
WS: (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;};
